package com.cskaoyan.operator;


/*
      逻辑运算符 针对 true false boolean类型的值做运算

      &:  true & false = false  true & true = true  false & true = false   false & false = false
       只要至少有一个操作数是false，结果就是false，只有当两个操作数都是true的时候，&运算的结果，才是true

     |:  true | false = true  true | true = true  false | true = true   false | false = false
        只要至少有一个操作数是true，结果就是true，只有当两个操作数都是false，|运算的结果才是false

     !:  !true = false  !false = true

    ^:  相同为false， 不同为true
        true ^ true = false  false ^ false = false
        true ^ false = true  false ^ true = true

     与运算符： &  && 它们的运算规则和运算结果都是一样的
     或运算符   |  || 它们的运算规则和运算结果都是一样的
     它们有没有区别呢？有区别  && || 它们的运算比较智能有 短路效果

     && 与运算比较智能, 当它发现&&运算符的第一个操作数结果已经是false，
      第二个操组数(对应的表达式)不去管他，直接得到结果&&的结果false

    &  这种与运算，比较的死板，即使&第一个操作数，它已经是false，此时它仍然会计算第二个操作数(表达式)，
      在把计算好的两个操作数的结果，做与运算，得到最终结果

    &&: 有短路效果，当第一个操作数为false，直接得出与运算的结果

    | || 类似，|| 也会有短路效果，当||发现第一个操作数是true，就不执行第二个表达式，直接得到结果 true
    如果我们发现，第一个操作数结果true，第二个操作数，结果都应该是true

    注意事项:
       a. 注意 && || 它们具有短路效果
       b.  0 < a < 10



 */
public class Logic {

    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        boolean result;

        // &
        result = a > 10 & b >1;
        System.out.println(result);
        result = a > 10 && b >1;
        System.out.println(result);

        // |
        result = a > 10 | b > 1;
        System.out.println(result);
        result = a > 10 || b > 1;
        System.out.println(result);

        // !
//        System.out.println(!true);
//        boolean boolValue = false;
//        System.out.println(!boolValue);
//
//        // ^
//        //       false    true
//        result = a > 10 ^ b >1;
//        System.out.println(result);
//
//        result = a > 10 ^ false;
//        System.out.println(result);


        // && 与运算的短路
        int c = 100;
        int d = 10;
        result = c < 0 && d++ > 0;
        System.out.println("result: " + result + "  " + d);

        result = c < 0 & d++ > 0;
        System.out.println("result: " + result + "  " + d);

        // || 或运算短路效果
        int e = 3;
        int f = 9;

        result = e > 0 || f++ < 0;
        System.out.println(f);

        result = e > 0 | f++ < 0;
        System.out.println(f);

        // 表示范围
        // 0 < a 关系运算 true or false
        // 0 < a < 10   ——>  a 既要 > 0 同时 a < 10
        // 如果我们要判断一个变量范围是否是在某个范围区间内
        int u = 40;
        // 使用与运算表示范围的判断
        result =  u > 0 && u <10;
        System.out.println(result);






    }
}
